import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { RoleService } from '../../modules/role/role.service';

/**
 * 权限守卫
 *
 * 使用方法：
 * @Permissions('product:create', 'product:update')
 * @Post('products')
 * createProduct() { }
 *
 * 只有拥有 product:create 或 product:update 权限的用户才能访问
 */
@Injectable()
export class PermissionsGuard implements CanActivate {
  constructor(
    private reflector: Reflector,
    private roleService: RoleService,
  ) {}

  async canActivate(context: ExecutionContext): Promise<boolean> {
    // 1. 获取所需权限
    const requiredPermissions = this.reflector.getAllAndOverride<string[]>(
      'permissions',
      [context.getHandler(), context.getClass()],
    );

    // 2. 如果没有设置权限要求，允许访问
    if (!requiredPermissions || requiredPermissions.length === 0) {
      return true;
    }

    // 3. 获取当前用户
    const request = context.switchToHttp().getRequest();
    const user = request.user;

    if (!user) {
      return false;
    }

    // 4. 管理员拥有所有权限
    if (user.role === 'admin') {
      return true;
    }

    // 5. 查找用户角色对应的权限
    // 这里假设用户只有一个角色
    // 实际项目中，用户可能有多个角色
    const role = await this.roleService.findByName(user.role);

    if (!role) {
      return false;
    }

    // 6. 获取角色的所有权限
    const rolePermissions = role.permissions.map((p) => p.name);

    // 7. 检查用户是否拥有所需权限（任意一个即可）
    return requiredPermissions.some((permission) =>
      rolePermissions.includes(permission),
    );
  }
}
